home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / preccx / prccx240.lha / common.c < prev    next >
Text File  |  1993-04-18  |  5KB  |  284 lines

  1.  
  2. /*
  3.    parser suite - and / or / nothing / something  parsers
  4.  
  5.    parser = [token] -> ([token],status)
  6.     
  7.    implemented as sideeffecting on [token], returns status.
  8. */
  9.  
  10. # include <stdarg.h>
  11.  
  12. # include "cc.h"
  13.  
  14. STATUS  p_andparse (p, q, o)
  15. PARSER p, q;
  16. ACTION *o;
  17. {
  18.     status tok;
  19.  
  20.     tok = p_andparse0 (p, q);
  21.     if (GOODSTATUS(tok))
  22.         pushACTION(o);
  23.     return (tok);
  24. }
  25.  
  26.  
  27. STATUS   p_nothing0 ()
  28. /*
  29. p_parser succeeds without looking at any tokens from
  30. the input stream.
  31. */
  32. {
  33.  
  34.     pushINCR;
  35.     return (SUCCESS);
  36. }
  37.  
  38. STATUS   p_nothing (k)
  39. ACTION *k;
  40. {
  41.     PARSER p_nothing0;
  42.  
  43.     return (p_attach(p_nothing0,k));
  44. }
  45.  
  46.  
  47. STATUS   p_anything0 ()
  48. /*
  49. Parser which takes any token at all - except 0 - and places it as
  50. a constant on the program stack.  This p_parser only fails at EOS.
  51. */
  52. {
  53.     TOKEN c;
  54.     VALUE v;
  55.  
  56.         c = *pstr;
  57.         v = lvbuff[pstr-buffer];
  58.         if (c)
  59.         {
  60.            MOVEON;
  61.         pushVALUE(v);
  62.         return (OK(v));    /* so CAN'T use attribute 0 */
  63.         }
  64.         return (FAILURE);
  65. }
  66.  
  67. STATUS  p_anything (k)
  68. ACTION *k;
  69. {
  70.     PARSER p_anything;
  71.  
  72.     return (p_attach (p_anything0,k));
  73. }
  74.  
  75. STATUS   p_first0 ()
  76. /*
  77. This p_parser only succeeds at BOS and does nothing
  78. */
  79. {    /* pstr CAN'T be < buffer. I am just being careful */
  80.     if ((void*)pstr <= (void*)buffer || pstr[-1]==(TOKEN)0) {
  81.         pushVALUE(SUCCESS);
  82.         return (SUCCESS);
  83.         }
  84.     /* doesnt move on */
  85.     return (FAILURE);
  86. }
  87.  
  88. STATUS   p_first (k)
  89. ACTION *k;
  90. {
  91.     PARSER p_first0;
  92.  
  93.     return(p_attach(p_first0,k));
  94. }
  95.  
  96. STATUS  p_eof0 ()
  97. {
  98.     if (yytchar==EOF) {
  99.        pushVALUE(SUCCESS);
  100.        return (SUCCESS);
  101.     }
  102.     return (FAILURE);
  103. }
  104.  
  105. STATUS  p_uerror0  (p)  
  106. PARSER *p;
  107. {
  108.         pushEXIT;
  109.  
  110.         pc=0;
  111.         pc=p_evaluate ();
  112.         pc=0;   /* we have to write the next program in the right place */
  113.  
  114.         if (yytchar!=EOF && 0==*pstr && /* then we can ask */
  115.             mygets(buffer,lvbuff)==0) 
  116.                 pstr=maxp=buffer;
  117.  
  118.         passcount++;
  119.  
  120.         p_enargs= 0;
  121.         p_entry = p;  /* set the btck_error reentry pt */
  122.  
  123.         fptr = fstack+1; /* reset the frame pointer - we won't backtrack */
  124.  
  125.         return (SUCCESS);
  126.      
  127.    /* and don't reset STACKVALUE *value because we may later backtrack
  128.         to earlier stack values */
  129. }
  130.  
  131. STATUS  p_uniq0  ()  
  132. {
  133.     return p_uerror0(0);
  134. }
  135.  
  136.  
  137. STATUS  p_lastuniq0  ()  
  138. {
  139.  
  140.     if (yytchar==EOF) /* we saw EOF already so don't try again */
  141.         return FAILURE;
  142.  
  143.     if (0 == *pstr)  /* we're in the right place to try & move on  */
  144.         {
  145.  
  146.                 pushEXIT;         /* remember to execute before pulling ...*/
  147.                 pc=0;
  148.                 pc=p_evaluate ();
  149.                 pc=0;             /* ... a new line */
  150.  
  151.         if (mygets(buffer,lvbuff)==0 && yytchar!=EOF)
  152.                 {  /* we got a new line */
  153.                     pstr=maxp=buffer;                
  154.                     pushVALUE(p_lastuniq0);
  155.                                                       
  156.                     passcount++;
  157.  
  158.                     fptr = fstack+1; /* reset the frame pointer -
  159.                                       * we won't backtrack */
  160.  
  161.                     return (SUCCESS);
  162.             }
  163.                 /* at EOF */
  164.  
  165.         return (SUCCESS);
  166.     }
  167.  
  168.                 /* not at EOL */
  169.  
  170.     return(FAILURE);
  171. }
  172.  
  173. STATUS   p_last0 ()
  174. /*
  175. This p_parser only succeeds at EOS.
  176. */
  177. {
  178.     if ((yytchar!=EOF) && (0 == *pstr))  /* does move on */
  179.         {
  180.             MOVEON;
  181.             pushVALUE(EOF);
  182.  
  183.        /*    if ((mygets(pstr,lvbuff+(pstr-buffer))==0)&&(yytchar!=EOF)) {
  184.  
  185.                    return (OK(EOF));
  186.             }
  187.          */ /* the MOVEON did the pull */
  188.  
  189.             
  190.         return (OK(EOF));
  191.         }
  192.     return (FAILURE);
  193. }
  194.  
  195.  
  196. STATUS   p_last (k)
  197. ACTION *k;
  198. {
  199.     PARSER p_last0;
  200.  
  201.     return (p_attach (p_last0, k));
  202. }
  203.  
  204. STATUS   p_exactly0 (c)
  205. /*
  206. this p_parser only succeds when given token c.
  207. It does NOT place the token as a literal on the program stack.
  208. */
  209. TOKEN   c;
  210. {
  211.     VALUE v;
  212.  
  213.     if (*pstr && *pstr == c)
  214.     {                     /* read the attribute value */
  215.                 v=lvbuff[pstr-buffer];
  216.         MOVEON;
  217.                 pushVALUE(v); /* save the attribute */
  218.         return (OK(v));
  219.     }
  220.     return (FAILURE);
  221. }
  222.  
  223. STATUS   p_notexactly0 (c)
  224. /*
  225. this p_parser only succeds when given a TOKEN not equal to c.
  226. It places the token as a literal on the program stack.
  227. */
  228. TOKEN   c;
  229. {
  230.     VALUE v;
  231.     if (*pstr && *pstr != c)
  232.     {
  233.         c=*pstr;
  234.                 v=lvbuff[pstr-buffer];
  235.         MOVEON;
  236.                 pushVALUE(v);
  237.         return (OK(v));
  238.     }
  239.     return (FAILURE);
  240. }
  241.  
  242. STATUS   p_exactly (c,k)
  243. TOKEN c;
  244. ACTION *k;
  245. {
  246.     PARSER p_exactly0;
  247.     status tok;
  248.  
  249.     tok = p_exactly0 (c);
  250.     if (GOODSTATUS(tok))
  251.         pushACTION(k);
  252.     return (tok);
  253. }
  254.  
  255. STATUS  p_attach0 (p)
  256. PARSER p;
  257. {
  258.     return(p ());
  259. }
  260.  
  261.  
  262. STATUS  p_range (p,f)
  263. PREDICATE *p;
  264. ACTION *f;
  265. {
  266.     status tok;
  267.  
  268.     tok = p_range0 (p);
  269.  
  270.     if (GOODSTATUS(tok))
  271.         pushACTION(f);
  272.  
  273.     return (tok);
  274. }
  275.  
  276. VOID  p_nop()
  277. /*
  278. a very trivial stack manipulation action
  279. */
  280. {
  281. }
  282.  
  283.  
  284.